﻿using System;
using System.Collections.Generic;
using System.Linq;

using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.Negocio.Validadores;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    using LM.InterfacesFabricas.Fabricas;
    using LM.InterfacesFabricas.Utilidades;
    using LM.Negocio.Objetos;

    public class ServicoDeLocacao : IServicoDeLocacao
    {
        private IRepositorioDeLocacao _repositorio;

        private ValidadorDeLocacao _validador;

        public ServicoDeLocacao()
        {
            _repositorio = FabricaGenerica.Crie<IRepositorioDeLocacao>();
            _validador = new ValidadorDeLocacao(
                                                _repositorio,
                                                FabricaGenerica.Crie<IRepositorioDeVeiculo>(),
                                                FabricaGenerica.Crie<IRepositorioDeVaga>(),
                                                FabricaGenerica.Crie<IRepositorioDeCliente>(),
                                                FabricaGenerica.Crie<IRepositorioDeDependente>(),
                                                FabricaGenerica.Crie<IRepositorioDeTabelaPreco>());
        }

        public IList<DtoLocacao> ConsultePeloCliente(string nomeCliente)
        {
            return ConversorDeObjetos.Copie<DtoLocacao, Locacao>(_repositorio.Consulte(l => l.Cliente.Nome == nomeCliente));
        }

        public IList<DtoLocacao> ConsultePelaPlacaVeiculo(string placaVeiculo)
        {
            return ConversorDeObjetos.Copie<DtoLocacao, Locacao>(_repositorio.Consulte(l => l.Veiculo.Placa == placaVeiculo));
        }

        public IList<DtoLocacao> Consulte(DateTime dataEntrada)
        {
            return ConversorDeObjetos.Copie<DtoLocacao, Locacao>(_repositorio.Consulte(l => l.DataEntrada == dataEntrada));
        }

        public void ImprimaReciboDeLocacao(DtoLocacao reciboDeLocacao)
        {
            throw new System.NotImplementedException();
        }

        public List<DtoLocacao> ConsulteLocacoesPorPeriodo(DateTime inicio, DateTime fim)
        {
            throw new NotImplementedException();
        }

        public void Cadastre(DtoLocacao objeto)
        {
            var locacao = ConversorDeObjetos.Copie<Locacao>(objeto);

            _validador.ValidaGragacao(locacao);

            _repositorio.Cadastre(locacao);

        }

        public void Atualize(DtoLocacao objeto)
        {
            var locacao = ConversorDeObjetos.Copie<Locacao>(objeto);

            _validador.ValidaAtualizacao(locacao);

            _repositorio.Atualize(locacao);
        }

        public void Exclua(int codigo)
        {
            var locacao = ConversorDeObjetos.Copie<Locacao>(_repositorio.Consulte(l => l.Codigo == codigo).FirstOrDefault());

            if (locacao != null)
            {
                _validador.ValidaExclusao(locacao);

                _repositorio.Exclua(locacao);
            }
        }

        public DtoLocacao Consulte(int codigo)
        {
            return ConversorDeObjetos.Copie<DtoLocacao>(_repositorio.Consulte(l => l.Codigo == codigo).FirstOrDefault());
        }

        public IList<DtoLocacao> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoLocacao, Locacao>(_repositorio.ConsulteTodos());
        }

    }
}
